package com.itheima.tliasmanager.controller;

import com.itheima.tliasmanager.annotation.Log;
import com.itheima.tliasmanager.annotation.Time;
import com.itheima.tliasmanager.pojo.domain.Dept;
import com.itheima.tliasmanager.pojo.vo.Result;
import com.itheima.tliasmanager.service.IDeptService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;


import java.util.List;

/**
 * 处理器层：
 *      处理所有前端部门相关的请求
 */
@Slf4j
@RequestMapping("/depts")
//@RestController
@Controller
@ResponseBody
public class DeptController {

    //private Logger log = LoggerFactory.getLogger(DeptController.class);

    @Autowired
    private IDeptService deptService;

    /**
     * 定义处理器方法，处理部门查询的请求
     */
    @GetMapping
    public Result list( ){
        System.out.println("目标方法，执行：list");

        //int num = 10/0;
        //1.接收请求参数
        log.trace("查询所有部门，参数：无");
        //2.调用service业务方法，获取部门列表
        List<Dept> depts = deptService.list();

        //3.封装并返回结果数据
        return Result.success(depts);
    }


    /**
     * 定义处理器方法，处理部门删除的请求
     *
     * kv格式请求参数接收方式：
     *      方式一：HttpServletRequest（不推荐）
     *      方式二：直接定义变量接收，要求：形参名称必须和请求参数名称一致（请求参数数量较少时，推荐使用）
     *             1.如果形参名称必须和请求参数名称一致
     *                  直接定义变量接收  Integer  id
     *             2.如果名称不一致，使用注解@RequestParam，设置请求变量接收指定的请求参数
     *                  使用注解@RequestParam("id") Integer num
     *      方式三：定义实体对象接收，要求：请求参数名称和实体对象的属性名称一致（请求参数数量较多时，推荐使用）
     *      方式四：定义Map对象接收，要求：添加@RequestParam标识使用Map集合接收（请求参数数量较多时，没有现成的实体对象使用，推荐使用）
     *
     * @RequestParam作用：
     *      1.设置形参变量接收指定的请求参数
     *      2.设置请求参数的默认值
     *      3.设置请求参数是否需要传递
     */
    @Log
    @DeleteMapping
    public Result removeById(@RequestParam Integer id){
        log.info("部门controller，当前线程名称：{}",Thread.currentThread().getName());
        //1.接收请求参数
        log.info("删除部门，参数：{}",id);

        //2.调用service业务方法，删除部门
        deptService.removeByDeptId(id);

        //3.封装并返回结果数据：
        return Result.success(); //code=1,msg="success",data=null
    }


    /**
     * 定义处理器方法，处理部门添加的请求
     *
     * json格式的请求参数接收方式：json格式请求参数存储请求体中
     *      方式一：@RequestBody  + 实体对象
     *      方式二：@RequestBody  + Map
     */
    @PostMapping
    public Result  add(  @RequestBody Dept dept  ){
//        try {
            //1.接收请求参数：json格式
            log.info("新增部门 ，请求参数： {}" , dept);

            //2.调用service业务方法，添加部门
            deptService.save(dept);


            //3.封装并返回结果数据
            return Result.success(); //code=1,msg="success",data=null
//        } catch (Exception e) {
//            //1.记录日志
//            //2.通知运维人员/开发人员，排查问题，处理问题
//            //3.封装统一异常结果数据给前端：code/msg/data
//            return Result.error("添加部门失败，睁大你的眼睛，部门名称重复了！");
//        }
    }


    /**
     * 定义处理器方法，处理查询部门详情请求
     * 请求路径：
     *      http://ip地址：port端口号/path/param  ?  k=v & k=v & k=v
     *
     *
     * path路径参数接收方式：
     *     1.请求路径不写写死参数：
     *       使用{变量}占位
     *     2.在参数中定义变量接收请求路径参数
     *       @PathVariable   变量  （变量名和请求路径中的占位符名称相同）
     */
    @Time
    @GetMapping("/{id}")
    public Result findById( @PathVariable  Integer id  ){
        //1.接收请求参数：path路径参数
        log.info("查询部门详情，id = {}",id);

        //2.调用service业务方法，查询部门详情
        Dept dept = deptService.getById(id);

        //3.封装并返回结果数据
        return Result.success(dept); //code = 1  ,msg=success ,data=查询到部门详情
    }


    /**
     * 定义处理器方法，处理更新部门请求
     */
    @PutMapping
    public Result update(@RequestBody Dept dept){
        //1.接收请求参数：json格式
        //@RequestBody  +  实体对象
        log.info("更新部门，参数：{}",dept);

        //2.调用service业务方法，更新部门数据
        deptService.updateById(dept);

        //3.封装并返回结果数据
        return Result.success();//code = 1 ,msg=success , data=null
    }

}
